#include "GSRDeviceThread.h"
#ifdef Q_OS_WIN
#include <windows.h>
#elif defined(Q_OS_LINUX)
#include <pthread.h>
#endif

GSRDeviceThread::GSRDeviceThread(GSRDevice* device, QObject* parent)
    : QThread(parent), m_gsrDevice(device), m_running(false)
{
    setObjectName("GSRDeviceThread");
}

GSRDeviceThread::~GSRDeviceThread()
{
    stopThread();
    wait(); // 等待线程结束
}

void GSRDeviceThread::startThread()
{
    QMutexLocker locker(&m_mutex);
    m_running = true;
    if (!isRunning()) {
        start();
    }
}

void GSRDeviceThread::stopThread()
{
    QMutexLocker locker(&m_mutex);
    m_running = false;

    // 如果线程正在运行，退出事件循环
    if (isRunning()) {
        quit();
    }
}

void GSRDeviceThread::run()
{
    qDebug() << "GSR设备线程已启动";

    // 设置高优先级
    setPriority(QThread::HighPriority);

    // 平台特定的CPU亲和性设置
#ifdef Q_OS_WIN
    // Windows平台设置CPU亲和性
    SetThreadAffinityMask(GetCurrentThread(), 0x2); // 使用CPU核心1
#elif defined(Q_OS_LINUX)
    // Linux平台设置CPU亲和性
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    CPU_SET(1, &cpuset);
    pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
#endif

    // 将GSR设备移动到此线程，但不移动定时器
    if (m_gsrDevice) {
        // 将设备移动到此线程
        m_gsrDevice->moveToThread(this);
        //不再移动定时器，而是在设备对象中创建和管理定时器
    }

    // 使用exec()进入事件循环，处理事件
    exec();

    qDebug() << "GSR设备线程已停止";
}
